<?php

namespace app\admin\controller;

use think\Controller;
use think\Request;
use app\common\model\Category as CategoryModel;
use app\common\model\Tags as TagsModel;
use app\common\model\Article as ArticleModel;
use app\common\model\TagArt as TagArtModel;

class Article extends Common
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        $articleData = ArticleModel::where('softdelete', 0)->order('aid','desc')->paginate(2);
        return view('', compact('articleData'));
    }

    /**
     * 显示创建资源表单页.
     *
     * @return \think\Response
     */
    public function create()
    {
        //分类数据
        $cateDatas = CategoryModel::all(function ($query) {
            $query->order('cid', 'asc');
        });
        //标签数据
        $tagDatas = TagsModel::all(function ($query) {
            $query->order('tid', 'asc');
        });

        return view('', compact('cateDatas', 'tagDatas'));
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        //表单数据
        $data = $request->post();
        if (!empty($data['tagArt'])) {
            //记录标签文章数据
            $tagArtData = $data['tagArt'];
            //为新增文章 移除标签文章字段
            unset($data['tagArt']);
        } else {
            $tagArtData = [];
        }

        //上传文件处理
        $file = request()->file('thumb');
        // 移动到框架应用根目录/public/uploads/ 目录下
        if ($file) {
            $info = $file->validate(['ext' => 'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads');
            if ($info) {
                // 成功上传后 获取上传信息
                $filePath = '/uploads/' . $info->getSaveName();
                $data['thumb'] = $filePath;
            } else {
                // 上传失败获取错误信息
                $this->error($file->getError());
                exit();
            }
        }
        $data['time'] = time();
        //添加数据库
        $ArticleM = new ArticleModel;
        // 调用当前模型对应的User验证器类进行数据验证
        $result = $ArticleM->validate(true)->save($data);
        if (false == $result) {
            // 验证失败 输出错误信息
            $this->error($ArticleM->getError());
        }

        // 获取新增文章的ID
        $artId = $ArticleM->aid;

        //标签文章表数据处理
        $tagArtM = new TagArtModel;
        $list = [];
        foreach ($tagArtData as $tag) {
            $list[] = [
                'tid' => $tag,
                'aid' => $artId
            ];
        }
        $tagArtM->saveAll($list);
        $this->success('新增成功', '/admin/article');
    }

    /**
     * 显示指定的资源
     *
     * @param  int $id
     * @return \think\Response
     */
    public function read($id)
    {

    }

    /**
     * 显示编辑资源表单页.
     *
     * @param  int $id
     * @return \think\Response
     */
    public function edit($id)
    {
        //分类数据
        $cateDatas = CategoryModel::all(function ($query) {
            $query->order('cid', 'asc');
        });
        //标签数据
        $tagDatas = TagsModel::all(function ($query) {
            $query->order('tid', 'asc');
        });

        //文章内容
        $articleData = ArticleModel::get($id);

        //文章标签id
        $articleTags = TagArtModel::where('aid', $id)->column('tid');
        $articleTags = $articleTags ? $articleTags : '';
        return view('', compact('cateDatas', 'tagDatas', 'articleData', 'articleTags'));
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request $request
     * @param  int $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {

        //表单数据
        $data = $request->post();
        unset($data['_method']);

        if (!empty($data['tagArt'])) {
            //记录标签文章数据
            $tagArtData = $data['tagArt'];
            //为新增文章 移除标签文章字段
            unset($data['tagArt']);
        } else {
            $tagArtData = [];
        }

        //上传文件处理
        $file = request()->file('thumb');
        // 移动到框架应用根目录/public/uploads/ 目录下
        if ($file) {
            $info = $file->validate(['ext' => 'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads');
            if ($info) {
                // 成功上传后 获取上传信息
                $filePath = '/uploads/' . $info->getSaveName();
                $data['thumb'] = $filePath;
            } else {
                // 上传失败获取错误信息
                $this->error($file->getError());
                exit();
            }
        }
        //添加数据库
        //可以添加验证器验证数据  此处忽略
        ArticleModel::where('aid', $id)->update($data);
        //标签文章表数据处理
        //删除该文章所有的标签，
        TagArtModel::where('aid', $id)->delete();
        //重新填写标签
        $tagArtM = new TagArtModel;
        $list = [];
        foreach ($tagArtData as $tag) {
            $list[] = [
                'tid' => $tag,
                'aid' => $id
            ];
        }
        $tagArtM->saveAll($list);
        $this->success('编辑成功', '/admin/article');
    }


    /**
     * 回收站
     */
    public function huishouzhan()
    {
        $articleData = ArticleModel::where('softdelete', 1)->paginate(2);
        return view('', compact('articleData'));
    }


    /**
     * 恢复数据
     */
    public function softback($id)
    {
        //修改字段
        $res = ArticleModel::where('aid', $id)->update(['softdelete' => '0']);
        if ($res) {
            $this->success('数据恢复成功', '/admin/article/huishouzhan');
        } else {
            $this->error('操作失败');
        }
    }


    /**
     * 软删除
     * @param $aid
     */
    public function softdelete($id)
    {
        //修改字段
        $res = ArticleModel::where('aid', $id)->update(['softdelete' => '1']);
        if ($res) {
            $this->success('成功放入回收站', '/admin/article');
        } else {
            $this->error('操作失败');
        }
    }

    /**
     * 删除指定资源
     *
     * @param  int $id
     * @return \think\Response
     */
    public function delete($id)
    {
        //直接删除 没有软删除
        $article = ArticleModel::get($id);
        //删除标签表
        TagArtModel::where('aid', $id)->delete();
        //删除上传文件
        @unlink($article['thumb']);


        //删除数据
        if ($article->where('aid', $id)->delete()) {
            $res['status'] = '1';
            $res['msg'] = '删除成功';
        } else {
            $res['status'] = '0';
            $res['msg'] = '删除失败';
        }
        return $res;
    }
}
